package com.aau.edu;

import com.aau.edu.pojo.Author;
import com.aau.edu.pojo.Book;

import java.util.*;
import java.util.stream.Stream;

//
public class StreamDemo02 {
    public static void main(String[] args) {
        //1、常用操作-创建流
        List<Author> authors = getAuthors();
        Stream<Author> stream = authors.stream();//单列集合
        Integer[] arr = {1, 2, 3, 4, 5};
        //数组：Arrays.stream(数组)或者使用Stream.of来创建
        Stream<Integer> stream1 = Arrays.stream(arr);
        Stream<Integer> stream2 = Stream.of(arr);
        //双列集合：转换成单列集合后再创建
        Map<String, Integer> map = new HashMap<>();
        map.put("蜡笔小新", 19);
        map.put("皮皮鲁", 18);
        map.put("高江栏", 19);
        Stream<Map.Entry<String, Integer>> stream3 = map.entrySet().stream();
        //2、常用操作-中间操作
        //filter：可以对流中的元素进行条件过滤，符合过滤条件的才能继续留在流中
        //需求：打印所有姓名长度大于1的作家的姓名
//        authors.stream()
//                .filter(author -> author.getName().length() > 1)
//                .forEach(author -> System.out.println(author.getName()));
        //map：可以把对流中的元素进行计算或转换
        //需求：打印所有作家的姓名
//        authors.stream()
//                .map(author -> author.getName())
//                .forEach(name -> System.out.println(name));
        //需求：打印所有作家的年龄，将年龄＋10
//        authors.stream()
//                .map(author -> author.getAge())
//                .map(age -> age + 10)
//                .forEach(age -> System.out.println(age));
        //distinct：可以去除流中重复元素
        //需求：打印所有作家的姓名，并且要求其中不能有重复元素
        //注意：distinct方法时依赖于Object中的equals方法来判断是否是相同对象的，所以需要注意重写equals方法。
//        authors.stream()
//                .distinct()
//                .forEach(author -> System.out.println(author.getName()));
        //sorted：可以对流中的元素进行排序
        //需求：对流中的元素按照年龄进行降序排序，并且要求不能有重复的元素
        //注意：如果调用空参的sorted()方法，需要流中的元素是实现了Comparable。
        authors.stream()
                .distinct()
                .sorted((o1, o2) -> o2.getAge() - o1.getAge())
                .forEach(author -> System.out.println(author.getAge()));
    }

    private static List<Author> getAuthors() {
        //数据初始化
        Author author = new Author(1L, "蒙多", 33, "一个从菜刀中明悟哲理的祖安人", null);
        Author author2 = new Author(2L, "亚拉索", 15, "狂风也追逐不上他的思考速度", null);
        Author author3 = new Author(3L, "易", 14, "是这个世界在限制他的思维", null);
        Author author4 = new Author(3L, "易", 14, "是这个世界在限制他的思维", null);

        //书籍列表
        List<Book> books1 = new ArrayList<>();
        List<Book> books2 = new ArrayList<>();
        List<Book> books3 = new ArrayList<>();

        books1.add(new Book(1L, "刀的两侧是光明与黑暗", "哲学,爱情", 88, "用一把刀划分了爱恨"));
        books1.add(new Book(2L, "一个人不能死在同一把刀下", "个人成长,爱情", 99, "讲述如何从失败中明悟真理"));

        books2.add(new Book(3L, "那风吹不到的地方", "哲学", 85, "带你用思维去领略世界的尽头"));
        books2.add(new Book(3L, "那风吹不到的地方", "哲学", 85, "带你用思维去领略世界的尽头"));
        books2.add(new Book(4L, "吹或不吹", "爱情,个人传记", 56, "一个哲学家的恋爱观注定很难把他所在的时代理解"));

        books3.add(new Book(5L, "你的剑就是我的剑", "爱情", 56, "无法想象一个武者能对他的伴侣这么的宽容"));
        books3.add(new Book(6L, "风与剑", "个人传记", 100, "两个哲学家灵魂和肉体的碰撞会激起怎么样的火花呢？"));
        books3.add(new Book(6L, "风与剑", "个人传记", 100, "两个哲学家灵魂和肉体的碰撞会激起怎么样的火花呢？"));

        author.setBooks(books1);
        author2.setBooks(books2);
        author3.setBooks(books3);
        author4.setBooks(books3);

        List<Author> authorsList = new ArrayList<>(Arrays.asList(author, author2, author3, author4));
        return authorsList;
    }
}
